// 1. 设计Animal的抽象类（eat的抽象方法）
abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    // 抽象方法
    public abstract void eat();
}

// 3. 定义Afraid接口
interface Afraid {
    void escape();
    void makeSounds();
}

// 2. Dog类继承Animal并实现Afraid接口
class Dog extends Animal implements Afraid {
    public Dog(String name) {
        super(name);
    }

    // 实现Animal的抽象方法
    @Override
    public void eat() {
        System.out.println(name + "正在吃狗粮");
    }

    // 实现Afraid接口的方法
    @Override
    public void escape() {
        System.out.println(name + "夹着尾巴逃跑了");
    }

    @Override
    public void makeSounds() {
        System.out.println(name + "发出：汪汪汪！（害怕的叫声）");
    }

    // Dog特有的方法
    public void bark() {
        System.out.println(name + "在叫：汪汪！");
    }
}

// 2. Cat类继承Animal并实现Afraid接口
class Cat extends Animal implements Afraid {
    public Cat(String name) {
        super(name);
    }

    // 实现Animal的抽象方法
    @Override
    public void eat() {
        System.out.println(name + "正在吃猫粮");
    }

    // 实现Afraid接口的方法
    @Override
    public void escape() {
        System.out.println(name + "迅速爬到树上");
    }

    @Override
    public void makeSounds() {
        System.out.println(name + "发出：喵喵喵！（害怕的叫声）");
    }

    // Cat特有的方法
    public void meow() {
        System.out.println(name + "在叫：喵喵！");
    }
}

// 4. Person类
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    // 使用Animal为参数的方法
    public void feed(Animal animal) {
        System.out.println(name + "正在喂" + animal.getName());
        animal.eat();
    }

    // 使用Afraid为参数的方法
    public void catchAnimal(Afraid afraidAnimal) {
        System.out.println(name + "试图抓住动物");
        afraidAnimal.makeSounds();
        afraidAnimal.escape();
    }

    public String getName() {
        return name;
    }
}